package io.zhiller.commonlib.utils.android

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.provider.Settings
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.zhiller.commonlib.data.models.PermissionModel
import io.zhiller.commonlib.data.models.PermissionStatus
import java.lang.reflect.Modifier

/**
 * 权限检查工具类
 */
object PermissionUtils {

  /**
   * 检查单个权限的状态
   *
   * @param context 上下文对象
   * @param permission 权限模型，包含权限字符串和当前状态
   * @return 返回权限的当前状态（未请求、已授予、拒绝或永久拒绝）
   */
  fun checkPermission(context: Context, permission: PermissionModel): PermissionStatus {
    // 如果权限状态为未请求，则直接返回未请求状态
    if (permission.permissionsStatus == PermissionStatus.NotAsked) return PermissionStatus.NotAsked

    // 检查权限是否已被授予
    return if (ContextCompat.checkSelfPermission(
        context,
        permission.permission
      ) == PackageManager.PERMISSION_GRANTED
    ) {
      PermissionStatus.Granted
    } else {
      // 检查是否应该显示请求权限的对话框
      if (ActivityCompat.shouldShowRequestPermissionRationale(
          context as Activity,
          permission.permission
        )
      ) {
        PermissionStatus.Denied
      } else {
        PermissionStatus.PermanentlyDenied
      }
    }
  }

  /**
   * 检查多个权限的状态，并返回永久拒绝的权限列表
   *
   * @param context 上下文对象
   * @param permissions 权限模型列表
   * @return 返回永久拒绝的权限字符串列表
   */
  fun checkMultiPermissions(context: Context, permissions: List<PermissionModel>): List<String> {
    val permissionList = mutableListOf<String>()
    // 遍历权限列表，检查每个权限的状态
    permissions.forEach { p ->
      // 如果权限状态为永久拒绝，则添加到结果列表中
      if(checkPermission(context, p) == PermissionStatus.PermanentlyDenied) permissionList.add(p.permission)
    }
    return permissionList
  }

  /**
   * 打开应用的设置页面
   *
   * @param context 上下文对象
   * @param packageName 应用的包名
   */
  fun openAppSettings(context: Context, packageName: String) {
    val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
    intent.data = Uri.fromParts("package", packageName, null)
    context.startActivity(intent)
  }
}





